
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>MySQL分库分表 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>MySQL分库分表 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么在处理海量数据时，需要对关系型数据库进行分库分表？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为关系型数据库在单表数据量较大的情况下，性能会急剧下降。单纯的分表只能减少单表的压力，不能减轻数据库的压力，因此通常在分表的同时进行分库操作，以解决互联网应用的大数据量存储问题。</div>
          </div>
          <div class="card-source">来源: 背景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">什么是垂直拆分？请说明其优缺点。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">垂直拆分是根据不同的业务，将数据库分为不同的库，例如会员数据库、订单数据库等。其优点是拆分后业务清晰，规则明确，系统整合或扩展容易；缺点是部分业务表无法关联查询，只能通过接口方式通讯，这提高了系统复杂度，并可能引入分布式事务问题。</div>
          </div>
          <div class="card-source">来源: 垂直拆分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">什么是水平拆分？它与垂直拆分有何根本不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">水平拆分是按照某个字段的某种规则（即按数据行进行切分），将同一个表的数据分散到多个库或表中。它与垂直拆分的根本不同在于，它不是按业务对表进行分类，而是将同一个表的行数据分散存储，以均摊数据和负载。</div>
          </div>
          <div class="card-source">来源: 水平拆分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了哪四种常见的分库分表路由算法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的四种常见路由算法是：取模算法、范围限定算法、范围加取模算法和预定义算法。</div>
          </div>
          <div class="card-source">来源: 分库分表算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">算法</div>
          <div class="card-question">请解释取模算法（Modulo Algorithm）是如何确定数据存储位置的。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">算法</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">取模算法通过对某个关键字段（如订单编号）进行哈希运算，然后将哈希结果对数据库实例数或子表数量N取余数。得到的余数 i 即对应于编号为 i 的数据库或子表，从而确定数据的最终存储位置。</div>
          </div>
          <div class="card-source">来源: 取模算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">算法</div>
          <div class="card-question">范围限定算法（Range Algorithm）是如何对数据进行划分的？请举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">算法</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">范围限定算法是根据某些范围字段（如时间或ID区间）对数据进行拆分和划分。例如，可以将用户ID范围在1到1000万的数据放入t_user_1表中，将ID范围在1000万到2000万的数据放入t_user_2表中。</div>
          </div>
          <div class="card-source">来源: 范围限定算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">“范围 + 取模”算法结合了哪两种策略？它主要为了解决什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该算法结合了范围限定和取模两种策略。它主要为了解决热点数据问题并实现数据库的水平扩展。其做法是先按范围（如ID区间）将数据路由到不同的数据库，然后在每个库内再根据ID取模路由到相应的子表中。</div>
          </div>
          <div class="card-source">来源: 范围 + 取模算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">垂直分库和垂直分表的主要思路分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">垂直分库是把多个表按业务耦合松紧归类，分别存放在不同的库，以分散服务器负载。垂直分表是把一个宽表的字段按访问频次或是否为大字段的原则拆分为多个表，以提升部分性能并使业务更清晰。</div>
          </div>
          <div class="card-source">来源: 分库分表维度</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">策略</div>
          <div class="card-question">在系统设计中，应何时考虑水平分库分表方案？在此之前应优先考虑哪些技术？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">策略</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当数据量极大且持续增长时，才应考虑水平分库水平分表方案。在此之前，应首先考虑使用缓存、读写分离、索引技术等方案来进行优化。</div>
          </div>
          <div class="card-source">来源: 分库分表维度</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
